home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 SRC / Demo / tkinter / guido / tkman.py < prev    next >
Text File  |  1995-12-21  |  7KB  |  256 lines

  1. #! /home/guido/bin.sgi/python
  2. #! /usr/local/bin/python
  3.  
  4. # Tk man page browser -- currently only shows the Tcl/Tk man pages
  5.  
  6. import sys
  7. import os
  8. import string
  9. import regex
  10. from Tkinter import *
  11.  
  12. import addpack
  13. addpack.addpack('/ufs/guido/src/python/Demo/guido/tkinter')
  14. from ManPage import ManPage
  15.  
  16. MANNDIR = '/usr/local/man/mann'
  17. MAN3DIR = '/usr/local/man/man3'
  18. MANNDIR = '/depot/sundry/man/mann'
  19. MAN3DIR = '/depot/sundry/man/man3'
  20.  
  21. def listmanpages(mandir):
  22.     files = os.listdir(mandir)
  23.     names = []
  24.     for file in files:
  25.         if file[-2:-1] == '.' and  (file[-1] in 'ln123456789'):
  26.             names.append(file[:-2])
  27.     names.sort()
  28.     return names
  29.  
  30. class SelectionBox:
  31.  
  32.     def __init__(self, master=None):
  33.         self.choices = []
  34.  
  35.         self.frame = Frame(master, {
  36.             'name': 'frame',
  37.             Pack: {'expand': 1, 'fill': 'both'}})
  38.         self.master = self.frame.master
  39.         self.subframe = Frame(self.frame, {
  40.             'name': 'subframe',
  41.             Pack: {'expand': 0, 'fill': 'both'}})
  42.         self.leftsubframe = Frame(self.subframe, {
  43.             'name': 'leftsubframe',
  44.             Pack: {'side': 'left', 'expand': 1, 'fill': 'both'}})
  45.         self.rightsubframe = Frame(self.subframe, {
  46.             'name': 'rightsubframe',
  47.             Pack: {'side': 'right', 'expand': 1, 'fill': 'both'}})
  48.         self.chaptervar = StringVar(master)
  49.         self.chapter = Menubutton(self.rightsubframe,
  50.                       {'name': 'chapter',
  51.                        'text': 'Directory',
  52.                        'relief': 'raised', 'bd': 2,
  53.                        Pack: {'side': 'top'}})
  54.         self.chaptermenu = Menu(self.chapter, {'name': 'chaptermenu'})
  55.         self.chaptermenu.add_radiobutton({'label': 'C functions',
  56.                           'value': MAN3DIR,
  57.                           'variable': self.chaptervar,
  58.                           'command': self.newchapter})
  59.         self.chaptermenu.add_radiobutton({'label': 'Tcl/Tk functions',
  60.                           'value': MANNDIR,
  61.                           'variable': self.chaptervar,
  62.                           'command': self.newchapter})
  63.         self.chapter['menu'] = self.chaptermenu
  64.         self.listbox = Listbox(self.rightsubframe,
  65.                        {'name': 'listbox',
  66.                     'relief': 'sunken', 'bd': 2,
  67.                     'width': 20, 'height': 5,
  68.                     Pack: {'expand': 1, 'fill': 'both'}})
  69.         self.l1 = Button(self.leftsubframe,
  70.                 {'name': 'l1',
  71.                  'text': 'Display manual page named:',
  72.                  'command': self.entry_cb,
  73.                  Pack: {'side': 'top'}})
  74.         self.entry = Entry(self.leftsubframe,
  75.                    {'name': 'entry',
  76.                     'relief': 'sunken', 'bd': 2,
  77.                     'width': 20,
  78.                     Pack: {'side': 'top',
  79.                        'expand': 0, 'fill': 'x'}})
  80.         self.l2frame = Frame(self.leftsubframe,
  81.                      {'name': 'l2frame',
  82.                       Pack: {'expand': 0, 'fill': 'none'}})
  83.         self.l2 = Button(self.l2frame,
  84.                 {'name': 'l2',
  85.                  'text': 'Search regexp:',
  86.                  'command': self.search_cb,
  87.                  Pack: {'side': 'left'}})
  88.         self.casesense = Checkbutton(self.l2frame,
  89.                          {'name': 'casesense',
  90.                           'text': 'Case sensitive',
  91.                           'variable': 'casesense',
  92.                           'relief': 'flat',
  93.                           Pack: {'side': 'left'}})
  94.         self.search = Entry(self.leftsubframe,
  95.                    {'name': 'search',
  96.                     'relief': 'sunken', 'bd': 2,
  97.                     'width': 20,
  98.                     Pack: {'side': 'top',
  99.                        'expand': 0, 'fill': 'x'}})
  100.         self.title = Label(self.leftsubframe,
  101.                    {'name': 'title',
  102.                     'text': '(none)',
  103.                     Pack: {'side': 'bottom'}})
  104.         self.text = ManPage(self.frame,
  105.                      {'name': 'text',
  106.                       'relief': 'sunken', 'bd': 2,
  107.                       'wrap': 'none', 'width': 72,
  108.                       'selectbackground': 'pink',
  109.                       Pack: {'expand': 1, 'fill': 'both'}})
  110.  
  111.         self.entry.bind('<Return>', self.entry_cb)
  112.         self.search.bind('<Return>', self.search_cb)
  113.         self.listbox.bind('<Double-1>', self.listbox_cb)
  114.  
  115.         self.entry.bind('<Tab>', self.entry_tab)
  116.         self.search.bind('<Tab>', self.search_tab)
  117.         self.text.bind('<Tab>', self.text_tab)
  118.  
  119.         self.entry.focus_set()
  120.  
  121.         self.chaptervar.set(MANNDIR)
  122.         self.newchapter()
  123.  
  124.     def newchapter(self):
  125.         mandir = self.chaptervar.get()
  126.         self.choices = []
  127.         self.addlist(listmanpages(mandir))
  128.  
  129.     def addchoice(self, choice):
  130.         if choice not in self.choices:
  131.             self.choices.append(choice)
  132.             self.choices.sort()
  133.         self.update()
  134.  
  135.     def addlist(self, list):
  136.         self.choices[len(self.choices):] = list
  137.         self.choices.sort()
  138.         self.update()
  139.  
  140.     def entry_cb(self, *e):
  141.         self.update()
  142.  
  143.     def listbox_cb(self, e):
  144.         selection = self.listbox.curselection()
  145.         if selection and len(selection) == 1:
  146.             name = self.listbox.get(selection[0])
  147.             self.show_page(name)
  148.  
  149.     def search_cb(self, *e):
  150.         self.search_string(self.search.get())
  151.  
  152.     def entry_tab(self, e):
  153.         self.search.focus_set()
  154.  
  155.     def search_tab(self, e):
  156.         self.entry.focus_set()
  157.  
  158.     def text_tab(self, e):
  159.         self.entry.focus_set()
  160.  
  161.     def updatelist(self):
  162.         key = self.entry.get()
  163.         ok = filter(lambda name, key=key, n=len(key): name[:n]==key,
  164.              self.choices)
  165.         if not ok:
  166.             self.frame.bell()
  167.         self.listbox.delete(0, AtEnd())
  168.         exactmatch = 0
  169.         for item in ok:
  170.             if item == key: exactmatch = 1
  171.             self.listbox.insert(AtEnd(), item)
  172.         if exactmatch:
  173.             return key
  174.         n = self.listbox.size()
  175.         if n == 1:
  176.             return self.listbox.get(0)
  177.         # Else return None, meaning not a unique selection
  178.  
  179.     def update(self):
  180.         name = self.updatelist()
  181.         if name:
  182.             self.show_page(name)
  183.             self.entry.delete(0, AtEnd())
  184.             self.updatelist()
  185.  
  186.     def show_page(self, name):
  187.         file = '%s/%s.?' % (self.chaptervar.get(), name)
  188.         fp = os.popen('nroff -man %s | ul -i' % file, 'r')
  189.         self.text.kill()
  190.         self.title['text'] = name
  191.         self.text.parsefile(fp)
  192.  
  193.     def search_string(self, search):
  194.         if not search:
  195.             self.frame.bell()
  196.             print 'Empty search string'
  197.             return
  198.         if self.frame.tk.getvar('casesense') != '1':
  199.             map = regex.casefold
  200.         else:
  201.             map = None
  202.         try:
  203.             if map:
  204.                 prog = regex.compile(search, map)
  205.             else:
  206.                 prog = regex.compile(search)
  207.         except regex.error, msg:
  208.             self.frame.bell()
  209.             print 'Regex error:', msg
  210.             return
  211.         here = self.text.index(AtInsert())
  212.         lineno = string.atoi(here[:string.find(here, '.')])
  213.         end = self.text.index(AtEnd())
  214.         endlineno = string.atoi(end[:string.find(end, '.')])
  215.         wraplineno = lineno
  216.         found = 0
  217.         while 1:
  218.             lineno = lineno + 1
  219.             if lineno > endlineno:
  220.                 if wraplineno <= 0:
  221.                     break
  222.                 endlineno = wraplineno
  223.                 lineno = 0
  224.                 wraplineno = 0
  225.             line = self.text.get('%d.0 linestart' % lineno,
  226.                          '%d.0 lineend' % lineno)
  227.             i = prog.search(line)
  228.             if i >= 0:
  229.                 found = 1
  230.                 n = max(1, len(prog.group(0)))
  231.                 try:
  232.                     self.text.tag_remove('sel',
  233.                                  AtSelFirst(),
  234.                                  AtSelLast())
  235.                 except TclError:
  236.                     pass
  237.                 self.text.tag_add('sel',
  238.                           '%d.%d' % (lineno, i),
  239.                           '%d.%d' % (lineno, i+n))
  240.                 self.text.mark_set(AtInsert(),
  241.                            '%d.%d' % (lineno, i))
  242.                 self.text.yview_pickplace(AtInsert())
  243.                 break
  244.         if not found:
  245.             self.frame.bell()
  246.  
  247. def main():
  248.     root = Tk()
  249.     sb = SelectionBox(root)
  250.     if sys.argv[1:]:
  251.         sb.show_page(sys.argv[1])
  252.     root.minsize(1, 1)
  253.     root.mainloop()
  254.  
  255. main()
  256.